package cn.yeamin.ms.config.aspect;

import java.util.Arrays;

import javax.servlet.http.HttpServletRequest;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.alibaba.fastjson.JSON;

import lombok.extern.slf4j.Slf4j;

/**
 *
 * @classDesc: 功能描述:(控制层面向切面打日志)
 * @author: 李彤
 * @createTime: 2017年7月26日 下午14:21:08
 * @version: v1.0
 * @copyright:奕明(上海)影视传媒有限公司
 */
//@EnableAspectJAutoProxy   //不需要配置,配置文件spring.aop.auto=true默认启动,引入了AOP依赖后会自动启动
// 声明是个切面
@Aspect
// 声明是个spring管理的bean
@Component
@Order(1)  //配置Bean的加载顺序,值越小越先被加载
@Slf4j
public class LogAspect {



	// 申明一个切点 里面是 execution表达式
	//@Pointcut("bean(*Controller)")
	@Pointcut("execution(* cn.yeamin.ms.*.controller..*.*(..))")
	private void controllerAspect() {
	}

	// 请求method前打印内容
	@Before(value = "controllerAspect()")
	public void methodBefore(JoinPoint joinPoint) {
		ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder
				.getRequestAttributes();
		HttpServletRequest request = requestAttributes.getRequest();
		log.info("===============请求数据===============");
		try {
			// 打印请求内容
			log.info("请求地址:" + request.getRequestURL().toString());
			log.info("请求方式:" + request.getMethod());
			log.info("请求类方法:" + joinPoint.getSignature());
			log.info("请求类方法参数:" + Arrays.toString(joinPoint.getArgs()));
		} catch (Exception e) {
			log.error("###AspectController.class methodBefore() ### ERROR:", e);
		}
		log.info("===============请求数据===============");
	}

	// 在方法执行完结后打印返回内容
	@AfterReturning(returning = "o", pointcut = "controllerAspect()")
	public void methodAfterReturing(Object o) {
		log.info("--------------响应数据----------------");
		try {
			log.info("Response内容:" + JSON.toJSONString(o));
		} catch (Exception e) {
			log.error("###AspectController.class methodAfterReturing() ### ERROR:", e);
		}
		log.info("--------------响应数据----------------");
	}

}